﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using ClassLibraryEntidades;
using System.Xml.Serialization;
using System.IO;

namespace SmartDeviceClient.Negocio
{
    public class LocalizadorSimulado: Localizador
    {
        /// <summary>
        /// Simplemente implementa la interfaz, no hace nada esta propiedad.
        /// </summary>
        public Ruta RutaSeguida
        {
            get
            {
                return null;
            }
            set
            {}
        }
        private Transporte.TipoTransporte tipotransporte;
        public Transporte.TipoTransporte TipoTransporte
        {
            get
            {
                return tipotransporte;
            }
        }

        private Ruta ruta;

        private int indice;

        private bool ficherovalido;

        private bool comienzo;

        private bool arconovalido;

        private int paso;
        private int num_pasos;
        private Arco arco_actual;

        public LocalizadorSimulado()
        {
            this.indice = 0;
        }
        
        #region Localizador Members

        //public Coordenada DamePosicion()
        //{
        //    if (!ficherovalido) return new Coordenada();

        //    Coordenada punto = new Coordenada();
        //    punto.x = ruta.Coordendas[indice];//Latitud
        //    punto.y=ruta.Coordendas[indice+1];//Longitud

        //    if (indice < ruta.Coordendas.Count-2)
        //        indice+=2;
        //    return punto;
        //}

        public Coordenada DamePosicion()
        {
            if (!ficherovalido) return new Coordenada();

            if ((paso == num_pasos) && (indice < ruta.arcos.Count))
            {
                paso = 0;
                if (esvalidoarco(ruta.arcos[indice]))
                {
                    arco_actual = ruta.arcos[indice];
                    tipotransporte = arco_actual.transporte.tipoTransporte;
                    num_pasos = (int)Distancia() / 2;
                    arconovalido = false;
                }
                else
                {
                    arconovalido = true;
                    num_pasos = 5;//para que de la sensación de que esta parado un momento
                }
                indice++;
            }
            return DameSiguiente();
        }

        private bool esvalidoarco(Arco arco)
        {
            if (arco.origen.coordenadas.x == 0 && arco.origen.coordenadas.y == 0)
                return false;
            if (arco.destino.coordenadas.x == 0 && arco.destino.coordenadas.y == 0)
                return false;
            return true;
        }

        private Coordenada DameSiguiente()
        {
            Coordenada punto = new Coordenada();

            if (arconovalido)
                punto = arco_actual.destino.coordenadas;
            else
            {
                punto.x = arco_actual.origen.coordenadas.x + (arco_actual.destino.coordenadas.x - arco_actual.origen.coordenadas.x) * paso / num_pasos;
                punto.y = arco_actual.origen.coordenadas.y + (arco_actual.destino.coordenadas.y - arco_actual.origen.coordenadas.y) * paso / num_pasos;
            }

            if (paso != num_pasos)
                paso++;


            return punto;

        }

        private int Distancia()
        {
            double cuadrado_x, cuadrado_y;
            double diferencia;
            cuadrado_x = Math.Pow(arco_actual.destino.coordenadas.x - arco_actual.origen.coordenadas.x, 2);
            cuadrado_y = Math.Pow(arco_actual.destino.coordenadas.y - arco_actual.origen.coordenadas.y, 2);
            diferencia = Math.Sqrt(cuadrado_x + cuadrado_y);
            return (int)diferencia;
        }

        #endregion

        public bool AbrirPuerto()
        {
            indice = 0;
            try
            {
                XmlSerializer xs = new XmlSerializer(typeof(Ruta));
                FileStream ms = new FileStream(Program.GetAppPath()+@"Recursos\GPS.xml", FileMode.Open);
                ruta = (Ruta)xs.Deserialize(ms);
                ms.Close();
                ficherovalido = true;

                if (ruta == null)
                {
                    ficherovalido= false;
                }
                if (ruta.arcos.Count < 1)
                {
                    ficherovalido= false;
                }                    

                indice = 0;
                comienzo = true;
                paso = 0;
                num_pasos = 0;
                Coordenada coor=new Coordenada();
                Nodo nod = new Nodo(coor, null);
                arco_actual = new Arco(nod, nod);

            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }

        public bool CerrarPuerto()
        {
            indice = 0;
            return true;
        }

    }
}
